package org.triiskelion.tinyspring.apidoc;
import org.reflections.Reflections;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.triiskelion.tinyspring.apidoc.annotation.ApiModel;
import org.triiskelion.tinyspring.apidoc.annotation.ApiRepository;
import org.triiskelion.tinyspring.apidoc.model.ApiDocumentation;
import org.triiskelion.tinyspring.apidoc.model.ApiModelDoc;
import org.triiskelion.tinyspring.apidoc.model.ApiModelFieldDoc;
import org.triiskelion.tinyspring.apidoc.model.ApiRepositoryDoc;
import java.net.URL;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: Sebastian MA
* Date: August 31, 2014
* Time: 16:15
*/
public class ApiScanner {
private static Logger log = LoggerFactory.getLogger(ApiScanner.class);
public static HashMap<String, String> apiModelMap = new HashMap<>();
public static ApiDocumentation scan(String version, String path, List<String> packages) {
Set<URL> urls = new HashSet<URL>();
FilterBuilder filter = new FilterBuilder();
log.debug("Scanning {} package(s)...", packages.size());
for(String pkg : packages) {
urls.addAll(ClasspathHelper.forPackage(pkg));
filter.includePackage(pkg);
}
Reflections reflections = new Reflections(new ConfigurationBuilder()
.filterInputsBy(filter).setUrls(urls));
ApiDocumentation apiDoc = new ApiDocumentation(version, path);
apiDoc.setRepositories(scanApiRepository(reflections.getTypesAnnotatedWith
(ApiRepository.class)));
apiDoc.setModels(scanApiModel(reflections.getTypesAnnotatedWith
(ApiModel.class)));
return apiDoc;
}
private static Map<String, ApiModelDoc> scanApiModel(Set<Class<?>> models) {
HashMap<String, ApiModelDoc> result = new HashMap<>();
for(Class<?> model : models) {
log.debug("Scanning class: " + model.getName());
ApiModelDoc modelDoc = ApiModelDoc.create(model);
if(modelDoc != null) {
result.put(modelDoc.getId(), modelDoc);
apiModelMap.put(modelDoc.getType(), modelDoc.getId());
}
}
for(ApiModelDoc doc : result.values()) {
for(ApiModelFieldDoc fieldDoc : doc.getFields()) {
fieldDoc.setTypeRef(apiModelMap.get(fieldDoc.getType()));
}
}
return result;
}
private static List<ApiRepositoryDoc> scanApiRepository(Set<Class<?>> controllers) {
List<ApiRepositoryDoc> result = new ArrayList<>();
for(Class<?> controller : controllers) {
log.debug("Scanning class: " + controller.getName());
ApiRepositoryDoc repo = ApiRepositoryDoc.create(controller);
if(repo != null) {
result.add(repo);
}
}
return result;
}
}